home *** CD-ROM | disk | FTP | other *** search
/ Collection of Internet / Collection of Internet.iso / faq / comp / 3d_progr next >
Text File  |  1994-04-15  |  22KB  |  558 lines

  1. Newsgroups: rec.games.programmer,comp.graphics,rec.answers,comp.answers,news.answers
  2. Path: bloom-beacon.mit.edu!hookup!usc!howland.reston.ans.net!math.ohio-state.edu!magnus.acs.ohio-state.edu!cis.ohio-state.edu!news.sei.cmu.edu!bb3.andrew.cmu.edu!honeydew.srv.cs.cmu.edu!rochester!rit!isc-newsserver!nick.csh.rit.edu!pat
  3. From: pat@mail.csh.rit.edu
  4. Subject: FAQ: 3-D Information for the Programmer
  5. X-Archive-Information: /pub/3dfaq/FAQ.n @ ftp.csh.rit.edu
  6. Message-ID: <1994Apr15.184932.8425@ultb.isc.rit.edu>
  7. Followup-To: rec.games.programmer
  8. Summary: Still in progress, fill-in-the-blanks...
  9. Originator: pat@nick.csh.rit.edu
  10. Keywords: game-programming 3d-transforms faq
  11. Sender: pat@mail.csh.rit.edu
  12. Nntp-Posting-Host: nick.csh.rit.edu
  13. Reply-To: pat@mail.csh.rit.edu
  14. Organization: Computer Science House @ RIT
  15. X-Posting-Information: This article posted automagically, weekly.
  16. Date: Fri, 15 Apr 1994 18:49:32 GMT
  17. Approved: news-answers-request@MIT.Edu
  18. Lines: 537
  19. Xref: bloom-beacon.mit.edu rec.games.programmer:15530 comp.graphics:23475 rec.answers:4908 comp.answers:4921 news.answers:18098
  20.  
  21. Archive-name: 3d-programmer-info
  22. Version: $Id: .header,v 1.7 1994/03/14 17:36:21 pat Exp $
  23.  
  24.                       O                                O
  25.  
  26.  ---+  +---- F A Q ------------------+  +------- F A Q ---------------+  +---
  27.  %[%|  |X$HOOR$H\[[8@DoooDDDDD8@@[%[%|  |X$HOOR$H\[[8@DoooDDDDD8@@[%[%|  |X$H
  28.  [[%|  |$C$OOR$H\%[8DooooDDDD8D@@[[[%|  |$C$OOR$H\%[8DooooDDDD8D@@[[[%|  |$C$
  29.  [[%|  |X$HHRR$H@[            88@@[[%|  |X$HHRR            DDDD88@@[[%|  |X$H
  30.  [[[|  |$$$HRR$H@%[@8ooooD   888@[[[[|  |$$$HRR$H@%[@8o   DDDD888@[[[[|  |$$$
  31.  [[[|  |X$$H            /   /  88[[[[|  |X$          /   /    D888[[[[|  |X$$
  32.  [%[|  |XC$H    \%[@8DDD   DD   @[[%[|  |XC    $H\%[@   DDDD   88@[[%[|  |XC$
  33.  [[%|  |XC$H    \%%@8DD   DDDD   @[[%|  |XC    $H\%%   DDDDDD   8@@[[%|  |XC$
  34.  [%[|  |X$$H    \%%@88DDD   D8   @[%[|  |X$    $H\%%@8   DDD8   8@@[%[|  |X$$
  35.  [%[|  |CX$H    \%%[88DDD88  D   @[%[|  |CX    $H\%%[88D  88D   8@@[%[|  |CX$
  36.  [%[|  |X$CH    \%[[@888D8D8  |  @[%[|  |X$   _$H\%[[@888  88   88@[%[|  |X$C
  37.  [%[|  |XXCH    |  [@888D888  | @@[%[|  |XX  |  H\@[[@888  8   88@@[%[|  |XXC
  38.  [%[|  |XC$$    \  \       |  |88@[%[|  |XC  \  \       |  |  8888@[%[|  |XC$
  39.  [%[|  |XX$HOR$HH@  [@88888  8D8@@[%[|  |XX$HOR  H@[%[@8  @8888D8@@[%[|  |XX$
  40.  [%[|  |X$CHOR$H\@%  @@@@Y  8888@@[%[|  |X$CHOR$  @%%[Y  @8888888@@[%[|  |X$C
  41.  [%[|  |CX$$OR$HH@%%      .d8D88@@[%[|  |CX$$OR$H      .d@@888D88@@[%[|  |CX$
  42.  [[[|  |X$$HOR$HH@%%[[@@@@88D8D88@[[[|  |X$$HOR$HH@%%[[@@@@88D8D88@[[[|  |X$$
  43.  [%[|  |CX$HOR$HH\%[%[@@@@888D88@@[%[|  |CX$HOR$HH\%[%[@@@@888D88@@[%[|  |CX$
  44.  ---+  +--------------- F A Q -------+  +------------------ F A Q ----+  +---
  45.  
  46. Contents:
  47. 1) General references for 3-d graphics questions.
  48. 2) How do I define an object?
  49. 3) How do I define space?
  50. 4) How do I define position?
  51. 5) How do I define orientation?
  52. 6) How do I define a velocity?
  53. 7) Drawing three-dimensional objects on a two-dimensional screen.
  54. 8) Vector Math - Dot Product and Cross-Product.
  55. 9) Matrix Math
  56. 10) Collisions.
  57. 11) Perspective.
  58. 12) Z-Buffering & the Painters Algorithm & BSP-Trees.
  59. 13) Shading.
  60. 14) 3-space clipping.
  61. 15) 3-d scanning.
  62. 16) Publically available source-code.
  63. 17) Books on the topics.
  64. 18) Other forums.
  65. 19) Current Contents of Archive ftp.csh.rit.edu::/pub/3dfaq
  66.  
  67. Last update:
  68.      03Mar94
  69.  
  70. What's new?
  71.  
  72.      A bit more matrix math.
  73.  
  74.      Added another book to the list
  75.  
  76.      Contents of the Archive I'm keeping on this stuff.
  77.  
  78. 1) General references for 3-d graphics questions.
  79.  
  80.      Well, this FAQ is just getting off the ground.  Hopefully it will
  81. touch on most of the bases you need to get started for now, and
  82. hopefully it will expand at least as fast as you need it too.  But...
  83. regardless, things you'll want to locate for more help are Matrix
  84. Algebra books, Physics books talking about Eulerian motion, and some
  85. books on the Graphics Hardware you want to program for.  The code
  86. examples included in this FAQ will most likely be in C with pseudo-code
  87. in comments.
  88.  
  89.      One of the most popular references, (and one of my favorites), is:
  90.           Computer Graphics: Principles and Practice
  91.           ------------------------------------------
  92.           Foley, van Dam, Feiner, and Hughes
  93.           Addison Wesley -- Reading, Massachusetts
  94.           (c) 1990.  ISBN 0-201-12110-7
  95.  
  96.      But, you'll also want to definitely check out the FAQ for
  97. comp.graphics.  That FAQ touches mainly on 2-D needs, but some 3-D
  98. aspects are reviewed there, too.
  99.  
  100. 2) How do I define an object?
  101.  
  102.      There are lots of ways to define objects.  One of the most commonly
  103. used is the OFF (Object File Format).  The OFF toolkit and a library of
  104. objects are available via anonymous ftp from gatekeeper.dec.com -- XXX
  105. ???.  The format provides easy methods for extensions and a base set of
  106. things you can expect for each object.  The toolkit is a bit bulky, but
  107. the file format (in ascii) is easy enough to parse by hand.
  108.  
  109.      The OFF.aoff file contains information about the object.  The most
  110. important one there is the location of the surface specification file
  111. (usually object name.geom).  This file also contains other attributes
  112.                -
  113. and file names relevant to this object.
  114.  
  115.      The OFF surface specification begins with the number of points, the
  116. number of polygons and the number of segments.
  117.  
  118.         npts nplys nsegs
  119.  
  120. This line is followed by the floating point coordinates for the points
  121. that make up the object.
  122.  
  123.         x1 y1 z1
  124.         x2 y2 z2
  125.         x3 y3 z3
  126.            .
  127.  
  128.            .
  129.  
  130.         x(npts) y(npts) z(npts)
  131.  
  132. Then, it gets a bit more complicated.  The following lines begin with a
  133. number to indicate the number of vertices in this polygon.  That number
  134. is followed by that many numbers, one for each vertex.  These are given
  135. in an order specified in the .aoff (usually conter-clockwise).  So, for
  136. example, a triangle and a pentagon which share a side are shown below.
  137.  
  138.         3       1 3 4
  139.         5       2 4 3 6 7
  140.  
  141. Here is some quick and dirty sample code to read in the .geom file:
  142.  
  143. struct polygon {
  144.     int nvert;          /* Number of vertices in this polygon */
  145.     int *verts;         /* Vertices in this polygon */
  146. };
  147.  
  148. struct object {
  149.     int npts;           /* The number of points */
  150.     int npolys;         /* The number of polygons */
  151.     int nsegs;          /* The number of segments */
  152.     double *point x,*point y,*point z;
  153.                  -        -        -
  154.     struct polygon *polys;
  155. };
  156.  
  157. int
  158. read geom file( char *geom file, struct object *obj )
  159.     -    -                -
  160. {
  161.     FILE *fp;
  162.     int i,j;
  163.  
  164.     if (!(fp = fopen(geom file,"r")))           /* Open the .geom file */
  165.                          -
  166.         return -1;
  167.  
  168.                                                 /* Get header information */
  169.     fscanf(fp,"%d %d %d",&obj.npts,&obj.npolys,&obj.nsegs);
  170.  
  171.         /*
  172.         ** Allocate room for the points.
  173.         */
  174.     obj.point x = (double *)malloc(obj.npts*sizeof(double));
  175.              -
  176.     obj.point y = (double *)malloc(obj.npts*sizeof(double));
  177.              -
  178.     obj.point z = (double *)malloc(obj.npts*sizeof(double));
  179.              -
  180.  
  181.     for (i=0;i<obj.npts;++i)
  182.         fscanf(fp,"%lf %lf %lf",&obj.point x[i],
  183.                                           -
  184.                                 &obj.point y[i],
  185.                                           -
  186.                                 &obj.point z[i]);
  187.                                           -
  188.  
  189.         /* Allocate room for the polygons.  */
  190.     obj.polys = (struct polygon *)malloc(obj.npolys*sizeof(struct polygon));
  191.  
  192.     for (i=0;i<obj.npts;++i) {
  193.             /* See how many vertices this has */
  194.         fscanf(fp,"%d",&obj.polys[i].nvert);
  195.  
  196.             /* Allocate room for vertices */
  197.         obj.polys[i].verts = (int *)malloc(obj.npolys*sizeof(int));
  198.  
  199.             /* Get each vertex */
  200.         for (j=0;j<obj.polys[i].nvert;++j)
  201.  
  202.             fscanf(fp,"%d",&obj.polys[i].verts[j]);
  203.  
  204.     }
  205. }
  206.  
  207. 3) How do I define space?
  208.  
  209.      There are several things to consider when picking a coordinate
  210. system.  Most important of these is how you intend to handle objects.
  211. If your objects are defined in terms of <x,y,z> triplets, it will
  212. require a fair bit of work on reading them in to turn them into
  213. spherical coordinates.  If you're looking to this FAQ for information on
  214. how to define the space your objects will be in, I'd strongly suggest
  215. using rectangular coordinates and some derivative of the OFF-format.
  216.  
  217.      For starters, let me just throw in that while our universe may be
  218. infinite in all directions, that doesn't make for good programming.  We
  219. have to limit ourselves to small enough numbers that we can multiply
  220. them together without overflowing them, we can divide them without
  221. crashing our systems, and we can add them without accidentally flipping
  222. a sign bit.
  223.  
  224.      Now, the fun begins.  The simplest form of defining the Universe is
  225. to flat out say that the Universe stretches over these coordinates, say
  226. in the bounding box of <-65536, -65536, -65536> to <65536, 65536,
  227. 65536>.  This is often referred to as a Universal Coordinate system or
  228. an Absolute Coordinate system.  Then, each object in the Universe will
  229. be centered about some coordinate in that range.  This includes your
  230. viewpoint.  Several strategies are available for dealing with the edge
  231. of the Universe.  One can make the Universe wrap around so that an
  232. object leaving the cube at < X, Y, 65536> will re-appear in the Universe
  233. at < X, Y, -65536>.  Or, one can make objects bounce or stop at the edge
  234. of the Universe.  And, given any approach, one can have the edge of the
  235. Universe be transparent or opaque.
  236.  
  237.      In an Absolute Coordinate system, all objects must be shown from
  238. the position of your viewpoint.  This involves lots of interesting math
  239. that we'll get into later.  But, in general, an objects position with
  240. respect to you is it's absolute position - your absolute position (with
  241. all kinds of hell breaking loose if you can see past the edge of the
  242. Universe).  Then, after this position is calculated, it must be rotated
  243. based on your orientation in the Universe.
  244.  
  245.      Another possibility for defining space is a Relative Coordinate
  246. system or a View-Centered Coordinate system.  In this sort of system,
  247. the Viewpoint is always at coordinates <0,0,0> and everything else in
  248. the Universe is based relatively to this home position.  This causes
  249. funky math to come into play when dealing with velocities of objects,
  250. but... it does wonders for not having to deal with the 'edge of the
  251. Universe'.  This is the Schroedinger's cat method of the 'edge of the
  252. Universe'.... in the truest sense of out of sight is out of mind.  Small
  253. provisions have to be made if objects aren't to wrap around.  But... a
  254. Relative Coordinate system can be used to give the illusion of infinite
  255. space on a finite machine.  (Yes, even your 486/66DX is finite).
  256.  
  257.      I'll leave spherical coordinates to a later version if people think
  258. they'll be of use...
  259.  
  260. 4) How do I define position?
  261.  
  262.      Position in an Absolute Coordinate system is easy.  Each object has
  263.  
  264. three coordinates.  These are often stored in a data-type called a
  265.  
  266. vector to abstract further the notion that these numbers belong
  267. together.
  268.  
  269.         typedef struct {
  270.                 long x;
  271.                 long y;
  272.                 long z;
  273.         } VECT;
  274.  
  275. Usually, each object in the Universe is defined about its center with
  276. each coordinate on its surface being centered at its own <0,0,0>.  This
  277. helps tremendously in rotating the object, and I would highly recommend
  278. this.  Then, the object as a whole is given a position in space.  When
  279. it comes time to draw this object, its points' coordinates get added on
  280. to its position.
  281.  
  282.      In a Relative Coordinate system, position is also fairly straight
  283. forward.  The view-point always has position VECT={ 0, 0, 0 };.  Other
  284. objects follow the same sort of system that they would in Absolute
  285. Coordinate systems.
  286.  
  287. 5) How do I define orientation?
  288.  
  289.      Orientation can be quite tricky.  I interchange some of the terms
  290. here quite often.  In 3-space, orientation must be defined be two-and-
  291. a-half angles.  "Two and a half?" you say.  Well, almost everyone uses
  292. three because two just isn't enough, but if you want to be technical,
  293. one of those angles only has to range from 0 - 180 degrees (0 - PI/2
  294. radians).
  295.  
  296.      But, taking that for granted now.... you have to pick an
  297. orientation for your view.  I personally prefer to have the X-axis run
  298. from left to right across the center of my screen.  I also like to have
  299. the Y-axis run from the bottom of my screen; and I also like to have the
  300. Z-axis running from me straight into my screen.  With some tweaking of
  301. plus and minus signs and a bit of re-ordering, all of the math here-in
  302. can be modified to reflect any orientation of the coordinate system.
  303. Some people prefer to have the Y-axis heading into the screen with the
  304. Z-axis going vertically.  It's all a matter of how you want to define
  305. stuff.
  306.  
  307.      Given that you've agreed with me that Z can go into the screen,
  308. what 3-angles do you need?  (Here's where I stand the biggest chance of
  309. mucking up the terms.)  You need roll, pitch, and yaw.  (I often mix up
  310. roll and yaw and such... so if you can follow along without getting
  311. locked into my terminology, future FAQ's will correct it.)
  312.  
  313.      Look at your monitor as you're reading this.  Now tilt your head so
  314. that your right ear is on your right shoulder.  This change in
  315. orientation is roll (or yaw... but I call it roll).
  316.  
  317.      Ok, now sit up straight again. Now bring your chin down to meet
  318. your chest.  (Hmmm... LOOK BACK NOW!!!, whew... glad you heard me.)
  319. That motion was pitch.
  320.  
  321.      Ok, now look over your right shoulder keeping your head vertical to
  322. see who's behind you.  (LOOK BACK AGAIN!!.)  Ok... that was yaw (or
  323. roll, but I call it yaw).
  324.  
  325.      That's the basics.  Now, what do I do with them?  Well, here's
  326. where a nice book on Matrix Arithmetic will help you out.  You have to
  327.  
  328. use these three angles to make a Transformation matrix.  [See the
  329.  
  330. section on Matrix Math].  Here is a typical method of doing these
  331. transformations: [Note, if you don't have Z going into your screen
  332. you'll have to munge these considerably].
  333.  
  334.         typedef double matrix[4][4];
  335.         double sr,sp,sy,cr,cp,cy;
  336.         matrix mr, mp, my;      /* individual transformations */
  337.         matrix s;               /* final matrix */
  338.  
  339.         sr = sin( roll );     cr = cos( roll );
  340.         sp = sin( pitch );    cp = cos( pitch );
  341.         sy = sin( yaw );      cy = cos( yaw );
  342.  
  343.                                 /* clear all matrixes
  344.                                 ** [See the section on Matrix Math]
  345.                                 */
  346.         identity( &mr ); identity( &mp ); identity( &my );
  347.                                 /* prepare roll matrix */
  348.         mr[0][0] = mr[1][1] = cr;
  349.         mr[1][0] = - (mr[0][1] = sr);
  350.  
  351.                                 /* prepare pitch matrix */
  352.         mp[1][1] = mp[2][2] = cp;
  353.         mp[1][2] = - (mp[2][1] = sp);
  354.  
  355.                                 /* prepare yaw matrix */
  356.         my[0][0] = my[2][2] = cy;
  357.         my[0][2] = - (my[2][0] = sy);
  358.  
  359.         multiply( &mr, &my, &s );
  360.         multiply( &s, &mp, &s );
  361.  
  362. 6) How do I define a velocity?
  363.  
  364. Sticky question.  I'll get to it in the next rev.
  365.  
  366. 7) Drawing three-dimensional objects on a two-dimensional screen.
  367.  
  368.      Modified from comp.graphics FAQ:
  369.  
  370.      "There are many ways to do this.  Some approaches map the
  371.      viewing rectangle onto the scene, by shooting rays through
  372.      each pixel center and assigning color according to the object
  373.      hit by the ray.  Other approaches map the scene onto the
  374.      viewing rectangle, by drawing each object into the region,
  375.      keeping track of which object is in front of which.
  376.  
  377.      The mapping mentioned above is also referred to as a
  378.      'projection', and the two most popular projections are
  379.      perspective projection and parallel projection.  For example,
  380.      to do a parallel projection of a scene onto a viewing
  381.      rectangle, you can just discard the Z coordinate, and 'clip'
  382.      the objects to the viewing rectangle (discard portions that
  383.      lie outside the region).  To do a perspective projection,
  384.      dividing each the x and the y by some multiple or the Z-depth
  385.      is the usual approach.
  386.  
  387.      For details on 3D rendering, the Foley, van Dam, Feiner and
  388.      Hughes book, reading.  Chapter 6 is 'Viewing in 3D', and
  389.      chapter 15 is 'Visible-Surface Determination'.  For more
  390.  
  391.      information go to chapter 16 for shading, chapter 19 for
  392.  
  393.      clipping, and branch out from there."
  394.  
  395. 8) Vector Math - Dot Product and Cross-Product.
  396.  
  397.      Adding and subtracting vectors is as easy as subtracting their
  398. respective parts:
  399.  
  400.         <A,B,C> + <D,E,F> = <A+D, B+E, C+F>
  401.         <A,B,C> - <D,E,F> = <A-D, B-E, C-F>
  402.  
  403.      Scaling vectors is as simple as multiplying each part by a
  404. constant:
  405.  
  406.         S * <A,B,C> = <S*A, S*B, S*C>
  407.  
  408.      The Dot-Product of two vectors is simply the sum of the products of
  409. their respective parts:
  410.  
  411.         <A,B,C> . <D,E,F> = A*D + B*E + C*F
  412.  
  413. Note that this value is not a vector.
  414.  
  415.      The Cross-Product of two vectors is a bit more complex (it is the
  416. determinant of the matrix with the direction vector as the first row,
  417. the first vector as the second row, and the second vector as the third
  418. row):
  419.  
  420.         <A,B,C> X <D,E,F> = <B*F - C*E, C*D - A*F, A*E - B*D>
  421.  
  422. Note that:
  423.  
  424. <A,B,C> X <D,E,F> = -1 * ( <D,E,F> X <A,B,C> )
  425.         -and-
  426. (<A,B,C> X <D,E,F>) . <A,B,C> = (<A,B,C> X <D,E,F>) . <D,E,F> = 0
  427.  
  428.      More later.
  429.  
  430. 9) Matrix Math
  431.  
  432.      The identity matrix is a square matrix (same number of rows as
  433. columns) with all elements {i,j} given by:
  434.  
  435.                   { 1.0   if i == j
  436.         m[i][j] = {
  437.                   { 0.0   otherwise
  438.  
  439.      Multiplication of matrices:
  440.  
  441.     if X is a matrix that is m rows and n columns (an m-by-n (or mxn) matrix)
  442.     and Y is a matrix that is n rows and r columns (nxr), then the product
  443.     X * Y ==> m[i][j] = sum{ a=0, a<n, X[i][a] * Y[a][j] };
  444.  
  445. As you can see in this example, the result is a matrix with m rows and r
  446. columns (an mxr) matrix.  The most usual case in basic 3-d graphics is
  447. multiplication of 3x3 or 4x4 matrices to each other.
  448.  
  449.      Some important things to remember about matrix multiplication: (The
  450.  
  451. following assume X and Y and Z are matrices and I is an identity matrix)
  452.  
  453.     X * Y rarely equals Y * X.  but,
  454.     X * ( Y * Z )  equals ( X * Y ) * Z
  455.     X * I = I * X = X
  456.     if (X * Y = I) then (Y * X = I)
  457.  
  458.      Multiplication of a Matrix and a Vector is simply a special case of
  459. multiplying two matrixes.  It just so happens that a vector is a matrix
  460. with only one column.  So, in order to multiply an mxn matrix by a
  461. vector, you have to have an nx1 matrix ("an n-vector" or "a vector in
  462. n").  The result is a vector in m.  As a quick example:
  463.  
  464.     [ a b ]   [ g ]   [ a*g + b*h ]
  465.     [ c d ] x [ h ] = [ c*g + d*h ]
  466.     [ e f ]           [ e*g + f*h ]
  467.  
  468. 10) Collisions.
  469.  
  470.      Sorry... wanted to get at least a partial FAQ out soon, so this
  471. section is mostly blank for now.  Will do more later.
  472.  
  473. 11) Perspective.
  474.  
  475.      Sorry... wanted to get at least a partial FAQ out soon, so this
  476. section is mostly blank for now.  Will do more later.
  477.  
  478. 12) Z-Buffering & the Painters Algorithm & BSP-Trees.
  479.  
  480.      Sorry... wanted to get at least a partial FAQ out soon, so this
  481. section is mostly blank for now.  Will do more later.
  482.  
  483. 13) Shading.
  484.  
  485.      Sorry... wanted to get at least a partial FAQ out soon, so this
  486. section is mostly blank for now.  Will do more later.
  487.  
  488. 14) 3-space clipping.
  489.  
  490.      Sorry... wanted to get at least a partial FAQ out soon, so this
  491. section is mostly blank for now.  Will do more later.
  492.  
  493. 15) 3-d scanning.
  494.  
  495.      Sorry... wanted to get at least a partial FAQ out soon, so this
  496. section is mostly blank for now.  Will do more later.
  497.  
  498. 16) Publically available source-code.
  499.  
  500.      Well, I've started a collection at ftp.csh.rit.edu::/pub/3dfaq/src.
  501. Feel free to upload relevant stuff (that I can't find on archie in under
  502. twenty minutes).  Some other sites of interest:
  503.     stereograms:
  504.  
  505.         ftp.comlab.ox.ac.uk::pub/Documents/3d
  506.  
  507.         http://enigma.phys.utk.edu/stereo/index.html
  508.  
  509.      Sorry... wanted to get at least a partial FAQ out soon, so this
  510. section is mostly blank for now.  Will do more later.
  511.  
  512. 17) Books on the topics.
  513.  
  514. Computer Graphics: Principles and Practice Foley, van Dam, Feiner, and
  515.      Hughes; Addison Wesley -- Reading, Massachusetts; (c) 1990.  ISBN
  516.      0-201-12110-7.
  517.  
  518.      I highly reccomend this book for the person seriously interested in
  519.      understanding Computer Graphics concepts for 2-D image-generation
  520.      and 3-D representation.  As a warning though, if you're struggling
  521.      to follow vector math and such, you might not spend the $60-$80
  522.      bucks on this one yet.
  523.  
  524. Programming in 3 Dimensions Christopher D. Watkins and Larry Sharp;
  525.      Barnes & Noble.
  526.  
  527.      I've never seen this book.  I've got an add for it in front of me.
  528.      (Sorry, no ISBN number listed).  I would guess it's a very low-
  529.      density version of some of the 3-D things from Foley.  The book
  530.      boasts sample source code on MS/PC-DOS floppy included.  "This one
  531.      is for all graphics enthusiasts who want a detailed look at 3-D
  532.      graphics and modeling.  Also features discussions of popular ray
  533.      tracinge methods and computer animation." [sic]
  534.  
  535. Computer Graphics Handbook: Geometry and Mathematics, Michael E.
  536.      Mortenson.  ISBN 0-8311-1002-3
  537.  
  538.      I've never seen this one, but it comes net-recommended.
  539.  
  540.      Sorry... wanted to get at least a partial FAQ out soon, so this
  541. section is mostly blank for now.  Will do more later.
  542.  
  543. 18) Other forums.
  544.  
  545.      Sorry... wanted to get at least a partial FAQ out soon, so this
  546. section is mostly blank for now.  Will do more later.
  547.  
  548. 19) Current Contents of Archive ftp.csh.rit.edu::/pub/3dfaq
  549.  
  550.    2 -rw-r--r--    1 pat      member    219 Apr  2 20:40 README
  551.   16 -rw-r--r--    1 pat      member   7787 Mar 28 19:11 DoomTechniques.gz
  552.   14 -rw-r--r--    1 pat      vr       6266 Apr  2 20:38 imath.gz
  553.  
  554.   22 -rw-r--r--    1 pat      vr      11262 Apr  2 20:43 imath.tar.gz
  555.  
  556. -- 
  557.       "I've seen attack ships on fire off the shoulder of Orion."
  558.